#include "proxyvalidationtask.h"
#include "global.h"
//#include <QNetworkAccessManager>
//#include <QNetworkReply>
//#include <QNetworkRequest>
//#include <QEventLoop>
//#include <QUrl>
//#include <QNetworkProxy>
//#include <QCoreApplication>

// ProxyValidationTask::ProxyValidationTask(const QString &proxy, QObject *parent)
//     :  m_proxy(proxy),QObject(parent)
// {
//     m_host=m_proxy.left(m_proxy.indexOf(':'));
//     m_port=m_proxy.section(':', 1, 1).toInt();
// }
ProxyValidationTask::ProxyValidationTask(const ProxyServerData &proxyServerData, QObject *parent)
    : m_proxyServerData(proxyServerData),QObject(parent)
{

    m_proxy = m_proxyServerData.proxyaddr;
    m_testproxydest = m_proxyServerData.testproxydest;
    m_host=m_proxy.left(m_proxy.indexOf(':'));
    m_port=m_proxy.section(':', 1, 1).toInt();
}


ProxyValidationTask::~ProxyValidationTask()
{
    //qDebug()<<__FUNCTION__<<m_proxy;
}

//void ProxyValidationTask::run()
//{
//    QNetworkProxy proxy;
//    proxy.setType(QNetworkProxy::Socks5Proxy);
//    proxy.setHostName(m_host);
//    proxy.setPort(m_port);
////    proxy.setHostName("122.9.54.111");
////    proxy.setPort(1080);
//    QNetworkAccessManager manager;

//    manager.setProxy(proxy);

//    QUrl url("http://142.251.42.228");
//    QNetworkRequest request(url); // 创建QNetworkRequest对象
//    request.setAttribute(QNetworkRequest::User, m_proxy); // 如果需要，可以在这里设置其他请求属性
//    qDebug()<<"发送请求到代理"<<proxy;
//    QEventLoop loop;

//    manager.setTransferTimeout(10000);

//    QNetworkReply *reply = manager.get(request); // 使用QNetworkRequest对象
//    connect(this, &ProxyValidationTask::exitTask, reply, &QNetworkReply::abort);
//    connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
//    loop.exec(); // 等待请求完成
//    emit validationResult(m_proxy, reply->error());
//    //qDebug()<<reply->readAll();

//    reply->deleteLater();
//}

void ProxyValidationTask::run()
{
    QNetworkProxy proxy;
    proxy.setType(QNetworkProxy::Socks5Proxy);
    proxy.setHostName(m_host);
    proxy.setPort(m_port);
    //    proxy.setHostName("122.9.54.111");
    //    proxy.setPort(1080);
    QNetworkAccessManager manager;

    manager.setProxy(proxy);

    //QUrl url("http://www.google.com");//74.125.21.102
    //QUrl url("http://142.250.197.196");//74.125.21.102
    QUrl url(g_testProxyDest.dd_values);
    //qDebug()<<g_testProxyDest.dd_values;
    QNetworkRequest request(url); // 创建QNetworkRequest对象
    request.setAttribute(QNetworkRequest::User, m_proxy); // 如果需要，可以在这里设置其他请求属性
    //qDebug()<<"发送请求到代理"<<proxy;
    //QNetworkReply *reply = manager.get(request); // 使用QNetworkRequest对象
    QNetworkReply *reply = manager.head(request); // 使用QNetworkRequest对象,只获取消息头
    QEventLoop loop;
    QTimer timer;

    // 连接超时信号，使用QEventLoop退出
    QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
    // 设置超时时间（例如5000毫秒）
    timer.setInterval(10000);
    timer.start();
    QString strReturn;

    // 处理请求完成或错误的情况
    // auto handleResponse = [ host,reply, &strReturn, &loop, &timer]() {
    //     if (timer.isActive()) {
    //         timer.stop(); // 停止计时器
    //         loop.quit();
    //     }

    //     if (reply->error() == QNetworkReply::NoError) {
    //         qDebug() << m_host << "连接成功，接收数据成功:" << reply->readAll().length();
    //         strReturn = "NoError";
    //     } else {
    //         strReturn = reply->errorString();
    //         qDebug() << m_host << "连接发生错误:" << strReturn;
    //     }

    //     reply->deleteLater(); // 删除网络回复对象
    // };

    // connect(reply, &QNetworkReply::finished, [&] (reply, strReturn, loop, timer){qDebug()<<"finish"<<m_host;});
    // connect(reply, &QNetworkReply::errorOccurred, [&] (reply, strReturn, loop, timer){qDebug()<<"errorOccurred"<<m_host;});

    // 连接网络请求结束或出错的信号，处理结果并退出事件循环
    QObject::connect(reply, &QNetworkReply::finished, [&] {
        if (timer.isActive()) {
            timer.stop(); // 停止计时器
            loop.quit();
        }

        // 请求成功，处理reply中的数据
        if (reply->error() == QNetworkReply::NoError) {
            //qDebug() << m_host<<"请求成功，接收数据成功:" << reply->readAll().length();
            strReturn = "NoError";
        } else {
            // 请求出错，输出错误信息
            strReturn = reply->errorString();
            //qDebug() << m_host<<"请求失败:" << strReturn;
        }

        reply->deleteLater(); // 删除网络回复对象
    });

    // QObject::connect(reply, &QNetworkReply::errorOccurred, [&, reply] {
    //     if (timer.isActive()) {
    //         timer.stop(); // 停止计时器
    //         loop.quit();
    //     }

    //     // 输出错误信息
    //     strReturn = reply->errorString();
    //     qDebug() << m_host<<"连接发生错误:" << strReturn;

    //     reply->deleteLater(); // 删除网络回复对象
    // });



    // // 连接网络请求结束信号
    // QObject::connect(reply, &QNetworkReply::finished, this, handleResponse);
    // // 连接网络请求错误信号
    // QObject::connect(reply, &QNetworkReply::errorOccurred, this, handleResponse);
    // // 运行事件循环等待网络响应
    loop.exec();

    // 检查是否超时
    if (timer.isActive()) {
        // 如果事件循环退出是因为timer timeout，那么表示超时
        timer.stop(); // 停止计时器防止它再次触发

        // 处理超时逻辑
         strReturn = "Request TimeOut";
        //qDebug() << m_host<<strReturn;
        //QObject::disconnect(reply, &QNetworkReply::errorOccurred, nullptr, nullptr);
        reply->abort(); // 终止网络请求
        reply->deleteLater(); // 删除网络回复对象
    }
    //m_finishedTasks.fetchAndAddOrdered(1); // 完成任务计数+1
    qDebug() << "请求结果:"<<m_proxy<<strReturn;
    emit proxyResult(m_proxy, strReturn);
}

void ProxyValidationTask::stopTask()
{
    qDebug()<<"stopTask";
    emit exitTask();
}

